package Both;

/**
 * Polytech' Nice - Sophia Antipolis / SI3 / Projet de fin de semestre
 * Annee 2011_2012
 * 
 * Reservation de transports en commun
 * 
 * Package Both
 * 
 * Classe Passager : modelisation d'un passager
 * 
 * @author M. Assou et J. Harnetiaux
 */

import java.io.Serializable;
import java.util.ArrayList;
import java.util.GregorianCalendar;

public class Passager implements Serializable {

    private static int num = 1;

    private String nom;
    private String prenom;
    private String login;
    private String mdp;
    private GregorianCalendar dateDeNaissance;
    private ProfilPassager profil;
    private String codeClient; // Genere par la methode genererCode()
    private ArrayList<Billet> billetsReserves;

    /**
     * Constructeur par defaut
     */
    public Passager() {
        this("inconnu", "inconnu", null, null, new GregorianCalendar(),
                ProfilPassager.ADULTE);
    }

    /**
     * Premier constructeur normal
     * 
     * @param nom
     *            Nom du passager
     * @param prenom
     *            Prenom du passager
     * @param login
     *            Login de connexion du passager
     * @param mdp
     *            Mot de passe de connexion du passager
     * @param date
     *            Date de naissance du passager
     * @param profil
     *            Profil du passager
     */
    public Passager(String nom, String prenom, String login, String mdp,
            GregorianCalendar date, ProfilPassager profil) {
        // Renseigner les attributs
        //
        this.nom = nom;
        this.prenom = prenom;
        this.login = login;
        this.mdp = mdp;
        this.dateDeNaissance = date;
        this.profil = profil;
        this.billetsReserves = new ArrayList<Billet>();

        // Incrementer la variable static num
        // Generer le code client
        //
        num = num + 1;
        this.genererCode();
    }

    /**
     * Second constructeur normal
     * 
     * @param nom
     *            Nom du passager
     * @param prenom
     *            Prenom du passager
     * @param login
     *            Login de connexion du passager
     * @param mdp
     *            Mot de passe de connexion du passager
     * @param profil
     */
    public Passager(String nom, String prenom, String login, String mdp,
            ProfilPassager profil) {
        this.nom = nom;
        this.prenom = prenom;
        this.login = login;
        this.mdp = mdp;
        this.dateDeNaissance = new GregorianCalendar();
        this.profil = profil;
        num = num + 1;
        this.genererCode();
        this.billetsReserves = new ArrayList<Billet>();
    }

    /**
     * Generer le code d'un voyageur
     */
    private void genererCode() {
        this.codeClient = nom.charAt(1) + "X" + num + "X" + prenom.charAt(1);
    }

    /**
     * @return le nom du passager
     */
    public String getNom() {
        return nom;
    }

    /**
     * @return le prenom du passager
     */
    public String getPrenom() {
        return prenom;
    }

    /**
     * @return le login de connexion du passager
     */
    public String getLogin() {
        return login;
    }

    /**
     * @return le mot de passe de connexion du passager
     */
    public String getMdp() {
        return mdp;
    }

    /**
     * @return la date de naissance du passager
     */
    public GregorianCalendar getDateDeNaissance() {
        return dateDeNaissance;
    }

    /**
     * @return le profil de profil du passager
     */
    public ProfilPassager getProfil() {
        return profil;
    }

    /**
     * @return le codeClient du passager
     */
    public String getCodeClient() {
        return codeClient;
    }

    /**
     * @return la liste des billets reserves
     */
    public ArrayList<Billet> getBilletsReserves() {
        return billetsReserves;
    }

    /**
     * @param nom
     *            Nouveau nom du passager
     */
    public void setNom(String nom) {
        this.nom = nom;
    }

    /**
     * @param prenom
     *            Nouveau prenom du passager
     */
    public void setPrenom(String prenom) {
        this.prenom = prenom;
    }

    /**
     * @param login
     *            Nouveau login de connexion du passager
     */
    public void setLogin(String login) {
        this.login = login;
    }

    /**
     * @param mdp
     *            Nouveau mot de passe de connexion du passager
     */
    public void setMdp(String mdp) {
        this.mdp = mdp;
    }

    /**
     * @param dateDeNaissance
     *            Nouvelle date de naissance du passager
     */
    public void setDateDeNaissance(GregorianCalendar dateDeNaissance) {
        this.dateDeNaissance = dateDeNaissance;
    }

    /**
     * @param profil
     *            Nouveau profil du passager
     */
    public void setProfil(ProfilPassager profil) {
        this.profil = profil;
    }

    /**
     * @param codeClient
     *            Nouveau code client du passager
     */
    public void setCodeClient(String codeClient) {
        this.codeClient = codeClient;
    }

    /**
     * @param billetsReserves
     *            Nouvelle liste de billets
     */
    public void setBilletsReserves(ArrayList<Billet> billetsReserves) {
        this.billetsReserves = billetsReserves;
    }

    /**
     * Retourne le nom et le prenom du client
     */
    public String getnomEtPrenom() {
        return nom + " " + prenom;
    }

    /**
     * Ajouter un billet a la liste des billets reserves
     * 
     * @param billet
     *            Billet a ajouter
     */
    public void ajouterBillet(Billet billet) {
        this.billetsReserves.add(billet);
    }

    /**
     * Ajouter des billets a la liste des billets du passager
     * 
     * @param billets
     *            Liste des billets a ajouter
     */
    public void ajouterBillets(ArrayList<Billet> billets) {
        for (Billet billet : billets) {
            this.billetsReserves.add(billet);
        }
    }

    /**
     * Calcule le total restant du
     * 
     * @return le montant a payer
     */
    public double calculerMontant() {
        double montant = 0;

        for (Billet billet : this.billetsReserves) {
            montant += billet.calculerPrix();
        }

        return montant;
    }

    /**
     * Surcharge de la m�thode toString
     */
    @Override
    public String toString() {
        return getnomEtPrenom() + " (" + codeClient + ") : "
                + profil.toString() + "\nMontant a payer : "
                + calculerMontant() + "�";
    }

    /**
     * Redefinition de la methode equals
     */
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }

        Passager p = (Passager) obj;
        if (!p.getDateDeNaissance().equals(this.dateDeNaissance)) {
            return false;
        }
        if (!p.getCodeClient().equals(this.codeClient)) {
            return false;
        }
        if (!p.getLogin().equals(this.login)) {
            return false;
        }
        if (!p.getMdp().equals(this.mdp)) {
            return false;
        }
        if (!p.getNom().equals(this.nom)) {
            return false;
        }
        if (!p.getPrenom().equals(this.prenom)) {
            return false;
        }
        if (!p.getProfil().equals(this.profil)) {
            return false;
        }
        if (!p.getBilletsReserves().equals(this.billetsReserves)) {
            return false;
        }
        return true;
    }
}
